package com.bauer.base.datastructure.tree.bminus;

import java.util.LinkedList;
import java.util.List;

/**
 * @Author ：rui.wei
 * @Date ：Created in 14:46 2019/7/31
 * @Description：
 */
public class BminusTreeNode {

    private int m;

    List<BminusNode> dataNodes = new LinkedList<>();

    BminusNode parent;


    public BminusTreeNode(int m) {
        this.m = m;
    }

    public void put(BminusNode bminusNode) {
        int i = 0;
        for (; i < dataNodes.size(); i++) {
            if (bminusNode.getData() < dataNodes.get(i).getData()) {
                break;
            }
        }
        if (i == dataNodes.size()) {
            dataNodes.add(bminusNode);
        } else {
            dataNodes.add(i, bminusNode);
        }

        if (i - 1 >= 0) {
            dataNodes.get(i - 1).setRight(bminusNode.getLeft());
        }
        if (i + 1 < dataNodes.size()) {
            dataNodes.get(i + 1).setLeft(bminusNode.getRight());
        }
    }

    public List<BminusNode> getDataNodes() {
        return dataNodes;
    }

    public void setDataNodes(List<BminusNode> dataNodes) {
        this.dataNodes = dataNodes;
    }

    public int size() {
        return dataNodes.size();
    }

    public BminusNode getMid() {

        return dataNodes.get(m / 2);
    }


    public BminusTreeNode getLeft() {
        BminusTreeNode left = new BminusTreeNode(m);
        left.setDataNodes(new LinkedList<>(dataNodes.subList(0, m / 2)));
        return left;
    }

    public BminusTreeNode getRight() {
        BminusTreeNode right = new BminusTreeNode(m);
        right.setDataNodes(new LinkedList<>(dataNodes.subList(m / 2 + 1, m)));
        return right;
    }

    public BminusTreeNode getBminusTreeNode(int data) {
        if (dataNodes.size() == 0) {
            return this;
        }

        for (int i = 0; i < dataNodes.size(); i++) {

            if (data < dataNodes.get(i).getData()) {
                //存在子树
                if (dataNodes.get(i).getLeft() != null) {
                    return dataNodes.get(i).getLeft();
                } else { //叶子节点
                    return this;
                }
            }
        }
        //存在子树
        if (dataNodes.get(dataNodes.size() - 1).getRight() != null) {
            return dataNodes.get(dataNodes.size() - 1).getRight();
        } else { //叶子节点
            return this;
        }
    }

    public int getM() {
        return m;
    }

    public void cleanData() {
        dataNodes.clear();
    }
}
